import useSWR, { SWRConfiguration, mutate } from 'swr';
import request from './request';

// 默认的 fetcher 函数
const fetcher = (url: string) => request.get(url);

// SWR 全局配置
export const swrConfig: SWRConfiguration = {
  // 默认的 fetcher 函数
  fetcher,
  // 重新验证配置
  revalidateOnFocus: false, // 窗口聚焦时不重新请求
  revalidateOnReconnect: true, // 网络重连时重新请求
  revalidateIfStale: true, // 数据过期时重新请求
  // 错误重试配置
  errorRetryCount: 3,
  errorRetryInterval: 5000,
  // 缓存配置
  dedupingInterval: 2000, // 2秒内相同请求去重
};

// 自定义 hooks

// 获取博客文章列表
export const usePosts = (params?: {
  page?: number;
  pageSize?: number;
  search?: string;
  tag?: string;
}) => {
  const queryString = params ? new URLSearchParams(params as any).toString() : '';
  const key = `/posts${queryString ? `?${queryString}` : ''}`;

  return useSWR(key, fetcher, {
    ...swrConfig,
    // 可以为特定请求覆盖配置
    revalidateOnFocus: false,
  });
};

// 获取单篇文章详情
export const usePost = (id: string | number) => {
  return useSWR(id ? `/posts/${id}` : null, fetcher, {
    ...swrConfig,
    // 文章详情可能不会频繁变化，可以设置更长的缓存时间
    refreshInterval: 0, // 不自动刷新
  });
};

// 获取用户信息
export const useUser = () => {
  return useSWR('/user/profile', fetcher, swrConfig);
};

// 获取标签列表
export const useTags = () => {
  return useSWR('/tags', fetcher, {
    ...swrConfig,
    // 标签列表变化不频繁，可以设置较长的缓存时间
    dedupingInterval: 300000, // 5分钟
  });
};

// 获取热门文章
export const useFeaturedPosts = () => {
  return useSWR('/posts/featured', fetcher, swrConfig);
};

// 工具函数

// 手动触发重新请求
export const refetchPosts = (params?: any) => {
  const queryString = params ? new URLSearchParams(params).toString() : '';
  const key = `/posts${queryString ? `?${queryString}` : ''}`;
  return mutate(key);
};

// 更新缓存中的文章数据（乐观更新）
export const updatePostInCache = (postId: string | number, updater: (post: any) => any) => {
  // 更新文章列表缓存
  mutate(
    (key) => typeof key === 'string' && key.startsWith('/posts'),
    (data: any) => {
      if (!data || !data.data) return data;
      return {
        ...data,
        data: data.data.map((post: any) => (post.id === postId ? updater(post) : post)),
      };
    },
    false, // 不重新请求
  );

  // 更新单篇文章缓存
  mutate(`/posts/${postId}`, updater, false);
};

// 清除所有缓存
export const clearCache = () => {
  mutate(() => true, undefined, false);
};

// 预加载数据
export const preloadPost = (id: string | number) => {
  mutate(`/posts/${id}`, request.get(`/posts/${id}`));
};

export default useSWR;
